﻿#define _CRT_SECURE_NO_WARNINGS 1

//拷贝构造函数

//拷⻉构造函数是构造函数的⼀个重载。
//拷⻉构造函数的第⼀个参数必须是类类型对象的引⽤
//C++规定⾃定义类型对象进⾏拷⻉⾏为必须调⽤拷⻉构造
//⾃动⽣成的拷⻉构造对内置类型成员变量会完成值拷⻉ / 浅拷⻉对⾃定义类型成员变量会调⽤他的拷⻉构造。
//如果⼀个类显⽰实现了析构并释放资源，那么他就需要显⽰写拷⻉构造，否则就不需要。
//传值返回会产⽣⼀个临时对象调⽤拷⻉构造，传值引⽤返回，返回的是返回对象的别名(引⽤)，没有产⽣拷⻉。

#include <iostream>
using namespace std;

class Date
{
public:
	//构造函数
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	
	//拷贝构造函数
	//使用引用类型
	//如果使用传值传参,则调用Date d2(d1)时,先传参，形参是实参的拷贝，传参后会调用拷贝构造函数,而调用拷贝构造函数又需要传参 会引发无穷递归
	                                      
	Date(const Date& d)//加入const增强代码健壮性,拷贝并不需要修改原对象
	{
		cout << "Date(Date& d)" << endl;
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}

	//使用指针类型
	//这⾥可以完成拷⻉，但是不是拷⻉构造，只是⼀个普通的构造
	//Date(const Date* d)
	//{
	//	cout << "Date(Date* d)" << endl;
	//	_year = d->_year;
	//	_month = d->_month;
	//	_day = d->_day;
	//}

	void Print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
	void Print() const
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

//int main()
//{
//    const Date d1(2025, 1, 18);
//	Date d2(d1);
//	/*Date d2(&d1);*/
//
//	// 也可以这样写，这⾥也是拷⻉构造
//	Date d3 = d1;
//	d3.Print();
//
//	d1.Print();
//	d2.Print();
//	return 0;
//}


//传引用返回  谨慎使用
Date& Func2()
{
	Date tmp(2024, 7, 5);
	tmp.Print();
	return tmp;
}
//函数结束后，tmp对象销毁，返回的是tmp的别名，相当于野引用


